import UIKit

/// 属性包装结构体(也可以是类或者枚举)

@propertyWrapper   //关键字必须写
struct TenOrLess {
    
    /// 用于存储包装值 设置为private只能内部访问
    private var num: Int
    
    /// 功能上使用的值
    private var maxValue: Int
    
    /// 呈现值 可以扩展功能使用 例如这里用来表示值是否被包装器修改
    private(set) var projectedValue: Bool
    
    /// 这个值是包装值 这里面是主要的获取和设置逻辑
    var wrappedValue: Int {
        get {
            return num
        }
        set {
            if newValue > maxValue {
                projectedValue = true
                num = maxValue
            } else {
                projectedValue = false
                num = newValue
            }
        }
    }
    
    /// 构造方法 可以指定初始值
    init() {
        maxValue = 10
        num = 0
        projectedValue = false
    }
    
    init(num: Int) {
        maxValue = 10
        if num > maxValue {
            projectedValue = true
            self.num = maxValue
        } else {
            projectedValue = false
            self.num = num
        }
    }
    
    init(num: Int, maxValue: Int) {
        self.maxValue = maxValue
        if num > maxValue {
            projectedValue = true
            self.num = maxValue
        } else {
            projectedValue = false
            self.num = num
        }
    }
    
}

class SmallRectangel {
    
    /// 为属性添加包装器  编译器将合成提供包装器存储空间和通过包装器访问属性的代码。
    @TenOrLess(num: 3) var height: Int
    @TenOrLess(num: 4, maxValue: 11) var width: Int
}

var sr = SmallRectangel()
print(sr.width, sr.height)

sr.width = 90

print(sr.width, sr.$width)

